package com.joker.aigc.jsonconvert.service.impl;


import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert;
import com.joker.aigc.jsonconvert.domain.bo.JsonToSqlBo;
import com.joker.aigc.jsonconvert.domain.enums.SqlExecuteTypeEnum;
import com.joker.aigc.jsonconvert.service.JsonConvertService;
import com.joker.aigc.utils.JsonToSqlUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Objects;

/**
 * @description:
 * @author: feixiang.li
 * @date: 2025-01-27 21:30
 */
@Slf4j
@Service
public class JsonConvertServiceImpl implements JsonConvertService {



    @Override
    public File convert(JsonToSqlBo jsonToSqlBo) {
        // step 1: 首先判断一下是否是正常的json文件
        Assert.isTrue(Objects.nonNull(jsonToSqlBo.getFile()) ||
                Objects.nonNull(jsonToSqlBo.getMultipartFile()), "文件为空");
        File successFile = null;
        try {
            // step 2: 然后判断json文件格式是否正确
            if(!JsonToSqlUtils.isJson(getReader(jsonToSqlBo))){
                // step 2.1 将 json文件转换成正确的json文件
                File tmp= FileUtil.createTempFile();
                jsonToSqlBo.getMultipartFile().transferTo(tmp);
                File toFile=FileUtil.createTempFile();
                successFile=JsonToSqlUtils.convertValidSql(tmp,toFile);
            }
        }catch (Exception e){
            log.error("json文件格式不正确",e);
            throw new RuntimeException("json文件格式不正确");
        }
        // 如果不是正常json文件，则进行转换
        if (successFile != null) {
            jsonToSqlBo.setFile(successFile);
        }
        return JsonToSqlUtils.sqlConvert(jsonToSqlBo);
    }

    public Reader getReader(JsonToSqlBo jsonToSqlBo) {
        Reader reader;
        if (Objects.nonNull(jsonToSqlBo.getFile())) {
            try {
                reader  = new InputStreamReader(Files.newInputStream(jsonToSqlBo.getFile().toPath()), StandardCharsets.UTF_8);
            } catch (Exception e) {
                log.error("文件读取失败", e);
                throw new RuntimeException("文件读取失败");
            }
        } else {
            try {
                reader = new InputStreamReader(jsonToSqlBo.getMultipartFile().getInputStream(), StandardCharsets.UTF_8);
            }catch (Exception e){
                log.error("文件读取失败", e);
                throw new RuntimeException("文件读取失败");
            }
        }

        return reader;
    }

    public static void main(String[] args) {
        JsonToSqlBo jsonToSqlBo = new JsonToSqlBo();
        jsonToSqlBo.setFile(new File("C:\\Users\\feixiang.li\\Desktop\\sql.txt"));
        jsonToSqlBo.setIsBatch(true);
        jsonToSqlBo.setBatchSize(1000);
        jsonToSqlBo.setSqlExecuteTypeEnum(SqlExecuteTypeEnum.INSERT);
        jsonToSqlBo.setTableName("test");
        System.out.println();
    }
}
